package com.yunhui.util;

import javax.servlet.http.HttpServletRequest;


/**
 * 记录发送请求的ip地址
 * @author pc
 *
 */
public class IPUtils {
	/**
	 * 客户端的IP地址： 规则：三种情况 (1)反向代理(nginx服务器), (2)代理(HTTP代理或者负载均衡服务器), (3)直接访问
	 * 
	 * @param request
	 * @return
	 */
	public static String getIp(HttpServletRequest request) {
		// 在一般情况下使用Request.getRemoteAddr()即可，但是经过nginx等反向代理软件后，这个方法会失效。
		String remoteAddr = request.getRemoteAddr();
		// X-Forwarded-For:简称XFF头，它代表客户端，也就是HTTP的请求端真实的IP，只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。
		// 它不是RFC中定义的标准请求头信息，在squid缓存代理服务器开发文档中可以找到该项的详细介绍。
		// 标准格式如下：X-Forwarded-For: client1, proxy1, proxy2。
		// 上面例子请求成功通过了三台代理服务器：proxy1, proxy2 及
		// proxy3。请求由client1发出，到达了proxy3(proxy3可能是请求的终点)
		String forwarded = request.getHeader("X-Forwarded-For");
		// 经过反向代理，如：nginx服务器
		String realIp = request.getHeader("X-Real-IP");
		String ip = null;
		if (realIp == null) {
			if (forwarded == null) {
				ip = remoteAddr;
			} else {
				ip = remoteAddr + "/" + forwarded; // ip1:代理服务器或负载均衡的服务器
			}
		} else {
			if (realIp.equals(forwarded)) {
				ip = realIp;
			} else {
				ip = realIp + "/" + forwarded.replaceAll(", " + realIp, "");// 逗号+空格
			}
		}
		return ip;
	}

	public static String getIpAddr(HttpServletRequest request) { 
		String ip = request.getHeader("X-Forwarded-For");
		if(WGHStringUtils.isNotBlank(ip) && !"unKnown".equalsIgnoreCase(ip)){
			// 多次反向代理后会有多个ip值，第一个ip才是真实ip
			int index = ip.indexOf(",");
			if (index != -1) {
				return ip.substring(0, index);
			} else {
				return ip;
			}
		}
		ip = request.getHeader("X-Real-IP");
		if (WGHStringUtils.isNotBlank(ip) && !"unKnown".equalsIgnoreCase(ip)) {
			return ip;
		}
		return request.getRemoteAddr();
	}

	
	
}
